/*
 * @Author: 橘子
 * @Date: 2022-12-11 11:00:28
 * @Project_description: 生成doc
 * @Description: 代码是我抄的，不会也是真的
 */
import dayjs from 'dayjs'
import docxtemplater from 'docxtemplater'
import ImageModule from 'docxtemplater-image-module-free' //需要就导入
import { Message } from 'element-ui'
import { saveAs } from 'file-saver'
import JSZipUtils from 'jszip-utils'
import PizZip from 'pizzip'

let doc = {}

doc.template = (templateName) => {
  let url = `./doc/${templateName}`
  return new Promise((resolve, ret) => {
    JSZipUtils.getBinaryContent(url, (err, temp) => {
      if (err) {
        Message.error('读取模板错误')
        ret(false)
      } else {
        // 创建一个PizZip实例，内容为模板的内容
        let zip = new PizZip(temp)
        resolve(zip)
      }
    })
  })
}

doc.word = async function (templateName, data, name = '') {
  // 获取模版
  let ret = await doc.template(templateName)
  // 图片相关
  let imageModule = new ImageModule({
    centered: false,
    //
    getImage(tagValue) {
      // return tagValue
      return new Promise(function (resolve, reject) {
        JSZipUtils.getBinaryContent(tagValue, function (error, content) {
          if (error) {
            Message.error('读取图片错误')
            return reject(error)
          }
          console.log(content, 'r3veoak')
          return resolve(content)
        })
      })
    },
    //
    getSize(img, tagValue, tagName) {
      // 固定图片大小
      return [300, 300]
      // 非固定（这里是设置宽度最大为300px的图片）
      let wid = 300
      return new Promise(function (resolve, reject) {
        var image = new Image()
        image.src = tagValue
        let imgWidth, imgHeight, scale
        image.onload = function () {
          imgWidth = image.width
          imgHeight = image.height
          scale = 0
          if (imgWidth > wid) {
            scale = wid / imgWidth
            imgWidth = wid
            imgHeight = imgHeight * scale
          }
          resolve([imgWidth, imgHeight])
        }
        image.onerror = function (e) {
          console.log('img, tagName, tagValue : ', img, tagName, tagValue)
          reject(e)
        }
      })
    },
  })
  // 创建并加载docxtemplater实例对象
  let word = new docxtemplater()
    .loadZip(ret)
    // 去除未定义值所显示的undefined
    .setOptions({
      nullGetter: function () {
        return ''
      },
    })
    //图片模块
    .attachModule(imageModule)
    .compile()
  // 设置模板变量的值，对象的键需要和模板上的变量名一致，值就是你要放在模板上的值
  await word.resolveData({
    ...data,
  })

  try {
    // 用模板变量的值替换所有模板变量
    // await word.renderAsync({ Image: 'examples/Image.png' })
    word.render()
  } catch (error) {
    // 抛出异常
    let e = {
      message: error.message,
      name: error.name,
      stack: error.stack,
      properties: error.properties,
    }
    console.log(JSON.stringify({ error: e }, null, 2))
    Message.error('读取模板错误')
    return
  }

  // 生成一个代表docxtemplater对象的zip文件（不是一个真实的文件，而是在内存中的表示）
  let out = word.getZip().generate({
    type: 'blob',
    mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  })
  // 将目标文件对象保存为目标类型的文件，并命名
  let fileName = name + dayjs().format('YYYY-MM-DD') + '.docx'
  saveAs(out, fileName)
}

export default doc
